﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;

namespace MoroMoro.Samples.ToDoList.Base.Persistence.Fake
{
    /// <summary>
    /// メモリ上のコレクションを使用して実装される作業スペースです。
    /// </summary>
    /// <seealso cref="IWorkspace"/>
    /// <seealso cref="FRepository&lt;TEntity&gt;"/>
    [Serializable]
    internal sealed class FWorkspace : IWorkspace
    {
        /// <summary>
        /// <see cref="FWorkspace"/> クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="allEntityList">全てのエンティティを格納するための、メモリ上のコレクション。</param>
        /// <exception cref="System.ArgumentNullException">allEntityList が null です。</exception>
        public FWorkspace(List<object> allEntityList)
        {
            if (allEntityList == null)
            {
                throw new ArgumentNullException("allEntityList");
            }
            AllEntityList = allEntityList;
        }


        /// <summary>
        /// 全てのエンティティを格納するための、メモリ上のコレクション。
        /// </summary>
        public List<object> AllEntityList;


        /// <summary>
        /// 基になるクエリを生成します。
        /// </summary>
        /// <typeparam name="TEntity">エンティティの型。</typeparam>
        /// <returns>基になるクエリ。</returns>
        internal IQueryable<TEntity> Query<TEntity>()
        {
            return AllEntityList.OfType<TEntity>().AsQueryable<TEntity>();
        }


        /// <inheritdoc/>
        public IRepository<TEntity> GetRepository<TEntity>()
            where TEntity : class
        {
            return new FRepository<TEntity>(this);
        }

        /// <inheritdoc/>
        public void Clear()
        {
        }

        /// <inheritdoc/>
        public void PersistAll(IsolationLevel isolationLevel = IsolationLevel.Unspecified)
        {
        }

        /// <inheritdoc/>
        public bool IsDirty()
        {
            return false;
        }


        /// <summary>
        /// リソースを解放します。
        /// </summary>
        public void Dispose()
        {
        }
    }
}
